﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using WFNetLib;

namespace 生命体征测试仪
{
    /// <summary>
    /// 包头
    /// </summary>
    public class CreativePacketHead
    {
        /// <summary>
        /// 包头大小
        /// </summary>
        public static Int32 HEAD_SIZE = 5;
        public byte Command;
        public byte Len = 0;
        public byte type;
        public byte[] Data;
        public CreativePacketHead()
        {
            Data = new byte[HEAD_SIZE];
        }
    }    
    public class CreativePacket
    {
        static byte[] Creative_crctable = new byte[]{
        0x00,0x5e,0xbc,0xe2,0x61,0x3f,0xdd,0x83,0xc2,0x9c,0x7e,0x20,0xa3,0xfd,0x1f,0x41,
        0x9d,0xc3,0x21,0x7f,0xfc,0xa2,0x40,0x1e,0x5f,0x01,0xe3,0xbd,0x3e,0x60,0x82,0xdc,
        0x23,0x7d,0x9f,0xc1,0x42,0x1c,0xfe,0xa0,0xe1,0xbf,0x5d,0x03,0x80,0xde,0x3c,0x62,
        0xbe,0xe0,0x02,0x5c,0xdf,0x81,0x63,0x3d,0x7c,0x22,0xc0,0x9e,0x1d,0x43,0xa1,0xff,
        0x46,0x18,0xfa,0xa4,0x27,0x79,0x9b,0xc5,0x84,0xda,0x38,0x66,0xe5,0xbb,0x59,0x07,
        0xdb,0x85,0x67,0x39,0xba,0xe4,0x06,0x58,0x19,0x47,0xa5,0xfb,0x78,0x26,0xc4,0x9a,
        0x65,0x3b,0xd9,0x87,0x04,0x5a,0xb8,0xe6,0xa7,0xf9,0x1b,0x45,0xc6,0x98,0x7a,0x24,
        0xf8,0xa6,0x44,0x1a,0x99,0xc7,0x25,0x7b,0x3a,0x64,0x86,0xd8,0x5b,0x05,0xe7,0xb9,
        0x8c,0xd2,0x30,0x6e,0xed,0xb3,0x51,0x0f,0x4e,0x10,0xf2,0xac,0x2f,0x71,0x93,0xcd,
        0x11,0x4f,0xad,0xf3,0x70,0x2e,0xcc,0x92,0xd3,0x8d,0x6f,0x31,0xb2,0xec,0x0e,0x50,
        0xaf,0xf1,0x13,0x4d,0xce,0x90,0x72,0x2c,0x6d,0x33,0xd1,0x8f,0x0c,0x52,0xb0,0xee,
        0x32,0x6c,0x8e,0xd0,0x53,0x0d,0xef,0xb1,0xf0,0xae,0x4c,0x12,0x91,0xcf,0x2d,0x73,
        0xca,0x94,0x76,0x28,0xab,0xf5,0x17,0x49,0x08,0x56,0xb4,0xea,0x69,0x37,0xd5,0x8b,
        0x57,0x09,0xeb,0xb5,0x36,0x68,0x8a,0xd4,0x95,0xcb,0x29,0x77,0xf4,0xaa,0x48,0x16,
        0xe9,0xb7,0x55,0x0b,0x88,0xd6,0x34,0x6a,0x2b,0x75,0x97,0xc9,0x4a,0x14,0xf6,0xa8,
        0x74,0x2a,0xc8,0x96,0x15,0x4b,0xa9,0xf7,0xb6,0xe8,0x0a,0x54,0xd7,0x89,0x6b,0x35
        };
        public bool bErWen = false;
        public CreativePacketHead Header;
        public byte[] Data;
        public int RxCount;
        public byte[] RxList;
        public byte NeedCommand;
        public static Int32 BUFFER_SIZE = 256;
        public byte[] AllData;
        public CreativePacket(byte com)
        {
            NeedCommand = com;
            Header = new CreativePacketHead();
            RxCount = 0;
            AllData = new byte[256];
        }
        public CreativePacket()
        {
            NeedCommand = 0xff;
            Header = new CreativePacketHead();
            RxCount = 0;
            AllData = new byte[256];
        }
        public static byte GetCRC8(byte[] x, int count)
        {
            byte crc = 0;
            for (int i = 0; i < count; i++)
                crc = Creative_crctable[crc ^ x[i]];
            return crc;
        }
        public static byte[] MakeCreativePacket(byte com, byte type)
        {
            return MakeCreativePacket(com, type, null);
        }
        public static byte[] MakeCreativePacket(byte com, byte type, byte b)
        {
            return MakeCreativePacket(com, type, new byte[] { b });
        }
        public static byte[] MakeCreativePacket(byte com, byte type, byte[] data)
        {
            byte[] txbuffer;
            if (data != null)
            {
                txbuffer = new byte[CreativePacketHead.HEAD_SIZE + data.Length + 1];
                txbuffer[0] = 0xaa;
                txbuffer[1] = 0x55;
                txbuffer[2] = com;
                txbuffer[3] = (byte)(data.Length+2);
                txbuffer[4] = type;
                for (int i = 0; i < data.Length; i++)
                {
                    txbuffer[i + CreativePacketHead.HEAD_SIZE] = data[i];
                }
                txbuffer[CreativePacketHead.HEAD_SIZE + data.Length] = GetCRC8(txbuffer, CreativePacketHead.HEAD_SIZE + data.Length);
            }
            else
            {
                txbuffer = new byte[CreativePacketHead.HEAD_SIZE + 1];
                txbuffer[0] = 0xaa;
                txbuffer[1] = 0x55;
                txbuffer[2] = com;
                txbuffer[3] = 2;
                txbuffer[4] = type;
                txbuffer[5] = GetCRC8(txbuffer, 5);
            }
            return txbuffer;
        }
        public bool DataPacketed(byte rx)
        {
            //判断读取的字节数+缓冲区已有字节数是否超过缓冲区总大小
            AllData[RxCount++] = rx;
            if (RxCount < (CreativePacketHead.HEAD_SIZE + 1))
            {
                Header.Data[RxCount - 1] = rx;
                if (RxCount == 1)
                {
                    if (Header.Data[0] != 0xaa)
                    {
                        RxCount = 0;
                    }
                }
                else if (RxCount == 2)
                {
                    if (Header.Data[1] != 0x55)
                    {
                        RxCount = 0;
                    }
                }
                else if (RxCount == 3)
                {
                    Header.Command = Header.Data[2];
                    if (NeedCommand != 0xff)
                    {
                        if (Header.Command != NeedCommand)
                        {
                            RxCount = 0;
                        }
                    }
                }
                else if (RxCount == 4)
                {
                    Header.Len = Header.Data[3];
                    if (Header.Len < 2)
                        RxCount = 0;
                    else
                        Data = new byte[Header.Len - 1];
                }
                else if (RxCount == 5)
                {
                    Header.type = Header.Data[4];
                }
            }
            else
            {
                Data[RxCount - CreativePacketHead.HEAD_SIZE - 1] = rx;
                if (RxCount == (CreativePacketHead.HEAD_SIZE + Header.Len - 1))
                {
                    if (bErWen)
                    {
                        byte s1 = Verify.GetVerify_byteXOR(AllData, RxCount - 1);
                        if (Data[Data.Length - 1] == s1)
                        {
                            return true;
                        }
                        else
                        {
                            RxCount = 0;
                            return false;
                        }
                    }
                    else
                    {
                        byte s1 = GetCRC8(AllData, RxCount - 1);
                        if (Data[Data.Length - 1] == s1)
                        {
                            return true;
                        }
                        else
                        {
                            RxCount = 0;
                            return false;
                        }
                    }
                }
            }
            return false;
        }
    }
}
